package br.com.as.dao;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import br.com.as.dominio.Cidade;
import br.com.as.dominio.Estado;
import br.com.as.dominio.Pais;
import br.com.as.utils.HibernateUtility;
import br.com.as.vo.Localidade;

/**
 * Classe para consistencia de endereco
 * 
 * @author msante
 *
 */
public class EnderecoDAO {

	public Pais pesquisarPaisPorId(Long id) throws Exception{
		Session sessao = HibernateUtility.getSession();
		try {
			Pais temp = (Pais) sessao.get(Pais.class, id);
			return temp;
		} catch (Exception e) {			
			throw e;
		} finally {
			sessao.close();
		}
	}
	
	public Estado pesquisarEstadoPorId(Long id) throws Exception{
		Session sessao = HibernateUtility.getSession();
		try {
			Estado temp = (Estado) sessao.get(Estado.class, id);
			return temp;
		} catch (Exception e) {			
			throw e;
		} finally {
			sessao.close();
		}
	}
	
	public Cidade pesquisarCidadePorId(Long id) throws Exception{
		Session sessao = HibernateUtility.getSession();
		try {
			Cidade temp = (Cidade) sessao.get(Cidade.class, id);
			return temp;
		} catch (Exception e) {			
			throw e;
		} finally {
			sessao.close();
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Localidade> pesquisarLocalidades(Cidade cidade) throws Exception{
		Session sessao = HibernateUtility.getSession();
		try {
			List<Localidade> lista = new ArrayList<Localidade>();
					
			StringBuffer str = new StringBuffer();
			str.append(" SELECT cid.nome, e.bairro, count(*) as total FROM agilesystem.endereco e ");
			str.append(" right join agilesystem.cliente c ");
			str.append(" on c.idEndereco = e.idEndereco ");
			str.append(" left join agilesystem.cidade cid ");
			str.append(" on cid.idCidade = e.idCidade ");
			str.append(" where e.idCidade =:id ");
			str.append(" group by e.idCidade, e.bairro ");

			Query query = sessao.createSQLQuery(str.toString());
			query.setLong("id", cidade.getId());
			List<Object[]> temp = query.list();
			for (Object[] object : temp) {
				Localidade l = new Localidade();
				l.setCidade((String)object[0]);
				l.setBairro((String)object[1]);
				l.setTotalClientes(new Long(object[2].toString()));
				lista.add(l);
			}
			return lista;
		} catch (Exception e) {			
			throw e;
		} finally {
			sessao.close();
		}
	}
	
	@SuppressWarnings("unchecked")
	public  List<Estado> listarEstados() throws Exception{
		List<Estado> lista = null;
		Session sessao = HibernateUtility.getSession();
		try {
			Query query = sessao.createQuery(" from Estado e order by e.nome ");		
			lista = query.list();			
		} catch (Exception e) {
			throw e;
		} finally {
			sessao.close();
		}
		return lista;
	}

	@SuppressWarnings("unchecked")
	public  List<Cidade> consultarCidades(Estado estado) throws Exception{
		List<Cidade> lista = null;
		Session sessao = HibernateUtility.getSession();
		try {
			Query query = sessao.createQuery(" from Cidade c where c.estado.id =:id order by c.nome ");
			query.setLong("id", estado.getId());
			lista = query.list();			
		} catch (Exception e) {
			throw e;
		} finally {
			sessao.close();
		}
		return lista;
	}
	
	@SuppressWarnings("unchecked")
	public  List<Cidade> consultarLocalidades(Cidade cidade) throws Exception{
		List<Cidade> lista = null;
		Session sessao = HibernateUtility.getSession();
		try {
			Query query = sessao.createQuery(" from Cidade c where c.estado.id =:id order by c.nome ");
			query.setLong("id", cidade.getId());
			lista = query.list();			
		} catch (Exception e) {
			throw e;
		} finally {
			sessao.close();
		}
		return lista;
	}
	
}
